/*
* infer 关键字
* 在条件类型表达式中，可以在 extends 条件语句中使用 infer 关键字来声明一个待推断的类型变量。
* infer 的作用是让 TypeScript 自己推断，并将推断的结果存储到一个类型变量中，infer 只能用于 extends 语句中。
*
* */

// 获取函数返回值类型
// 如果 T 满足约束条件 (...args: any) => any，并且能够赋值给 (...args: any) => infer R，则返回类型为 R，否则为 any 类型。
// type ReturnType<T extends (...args: any) => any> = T extends (...args: any) => infer R ? R : any
//
// const add = (x:number, y:number) => x + y
// type t = ReturnType<typeof add> // type t = number


// -------------------正文--------------------------------------
// L 是字符串第一个字母， R 是剩余的部分, 如果不能拆成字符串，就返回原始值
type CapitalizeString<T> = T extends `${infer L}${infer R}` ? `${Uppercase<L>}${R}` : T

type A = CapitalizeString<'abcd'>


type a1 = CapitalizeString<'handler'>       // Handler
type a2 = CapitalizeString<'parent'>        // Parent
type a3 = CapitalizeString<233>             // 233

export {}